const express = require('express')
const {verifyToken, createToken} = require('./utils/jwt')
const multer = require('multer')
const upload = multer({dest: './public/uploads/'})

const app = express()
app.listen(9000, '0.0.0.0', () => console.log('http://localhost:9000'))
app.use(require('cors')())
app.use(express.urlencoded({extended: false}))
app.use(express.json())

// 静态资源服务
app.use(express.static('public'))

// 验证token
app.use((req, res, next) => {
  // 是否已经登录的验证  验证它传入过来的token值
  // 如果是登录请求，则放过去
  if ('/api/login' != req.path) {
    // 它不是登录请求，就需要来判断它是否已经是一个合法的登录用户
    // 客户端接口会在每次请求时把token数据通过请求头传递过来，在服务器中间件中完成处理工作
    let token = req.headers.token
    // 验证token的合法性
    let data = verifyToken(token)
    if (data) {
      // 验证它的合法性
      // 验证它有没有过期
      if (Date.now() > data.exp) {
        return res.send({
          code: 1001,
          msg: 'token过期了',
          data: null
        })
      }
      // 如果没有过期，看看用户名是否真的在数据库中存在
      if (data.username != 'admin') {
        return res.send({
          code: 1002,
          msg: '账号或密码错误',
          data: null
        })
      }
      // 生成一个新token给客户端，让他token续约成功
      const token = createToken({
        uid: data.uid,
        username: data.username,
        exp: Date.now() + 7200000
      })
      // 续约的token通过响应头发送给客户端
      res.setHeader('token', token)
      next()
    } else {
      // token是无效的
      res.send({
        code: 1000,
        msg: 'token无效',
        data: null
      })
    }
  } else {
    // 它是登录请求，无需去验证它是否已经登录
    next()
  }
})

// 登录
app.use('/api', require('./router/login'))
// 电影管理
// 正在热映
app.use('/api', require('./router/film'))

// 角色管理
app.use('/api', require('./router/role'))
// 权限管理
app.use('/api', require('./router/auth'))
// 用户
app.use('/api', require('./router/user'))


// 文件上传
app.post('/api/upload', upload.single('file'), (req, res) => {

  res.send({
    code: 0,
    msg: 'ok',
    data: {url: '/uploads/' + req.file.filename}
  })
})

